#include <future>
#include <iostream>
#include <unistd.h>
#include <memory>
/**************************
 *          学习编写异步线程池  future与async的使用
 * ********************* */

int add(int a, int b)
{
    std::cout << "add()" << std::endl;
    sleep(3);
    return a + b;
}

// int main()
// {
//     // lauch async:立即创建线程开始执行，需要的时候才获取结果
//     // lauch deferred:get获取的时候创建线程开始执行，阻塞当前线程

//     std::future<int> result = std::async(std::launch::deferred, add, 10, 11);
//     sleep(2);
//     std::cout << "---------111-------------" << std::endl;
//     std::cout << result.get() << std::endl;
//     return 0;
// }

/**************************
 *          学习编写异步线程池  future与promise的使用
 * ********************* */

// void add(int a, int b, std::promise<int> &prom)
// {
//     std::cout << "add()" << std::endl;
//     // 设置值
//     prom.set_value(a + b);
//     sleep(2);
//     std::cout << "return " << std::endl;
//     return;
// }

// int main()
// {
//     std::promise<int> promi;
//     std::future<int> fu = promi.get_future(); // 产生关联

//     // 创建线程来异步执行
//     std::thread thr(add, 10, 20, std::ref(promi));

//     std::cout << fu.get() << std::endl; // 值获取到了，就不会阻塞当前线程

//     thr.join();
//     return 0;
// }

// int main()
// {
//     auto ptask = std::make_shared<std::packaged_task<int(int, int)>>(add);
//     //通过future建立同步关系
//     std::future<int> fu=ptask->get_future();
//     std::thread thr([&ptask](){
//         (*ptask)(10,20);
//     });
//     std::cout<<fu.get()<<std::endl;

//     sleep(2);
//     thr.join();
//     return 0;
// }

/***************************************
 * 基于packaged_task和future的线程池
 *
 * ************************************ */